package com.divemotor.ventarepuestosinternet.service.impl;

import java.io.Serializable;
import java.util.List;

import org.jboss.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.divemotor.ventarepuestosinternet.beans.adapter.ImagenAdapter;
import com.divemotor.ventarepuestosinternet.dao.ImagenDAO;
import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Imagen;
import com.divemotor.ventarepuestosinternet.model.Marca;
import com.divemotor.ventarepuestosinternet.model.ModeloFabrica;
import com.divemotor.ventarepuestosinternet.model.SubGrupo;
import com.divemotor.ventarepuestosinternet.model.TipoComponente;
import com.divemotor.ventarepuestosinternet.service.ImagenService;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;
import com.divemotor.ventarepuestosinternet.util.FechasUtil;
import com.divemotor.ventarepuestosinternet.util.FileUtil;

@Service(value = "imagenService")
@Transactional(rollbackFor=Exception.class)
public class ImagenServiceImpl implements ImagenService, Serializable {

	private static final Logger logger = Logger.getLogger(ImagenServiceImpl.class);
	
	private static final long serialVersionUID = 1L;
	
	@Autowired
	private ImagenDAO imagenDAO;
	@Autowired
	private String imgRuta;
	
	@Override
	public List<Imagen> listarImagenesPorSubGrupo(SubGrupo subGrupo) throws DivemotorBusinessException {
		Imagen imagen = new Imagen();
		imagen.setSubGrupo(subGrupo);
		return imagenDAO.listarImagenesPorSubGrupo(imagen);
	}

	private List<Imagen> listarImagenes(SubGrupo subGrupo, ModeloFabrica modeloFabrica) throws DivemotorBusinessException {
		Imagen imagen = new Imagen();
		imagen.setSubGrupo(subGrupo);
		imagen.setModeloFabrica(modeloFabrica);
		return imagenDAO.listarImagenesPorSubGrupoYModeloFabrica(imagen);
	}
	
	@Override
	public String obtenerRutaImagenes() throws DivemotorBusinessException {
		return this.imgRuta;
	}

	@Override
	public void insertar(Imagen imagen) {
		logger.info("insertar");
		try {
			imagen.setEstado(Constantes.ESTADO_ACTIVO);
			imagen.setUsuarioCreacion(DatosDeSession.obtenerUsuarioAutenticado());
			imagen.setFechaCreacion(FechasUtil.obtenerFechaActual());
			
			if (imagen.getNombreArchivo().substring(imagen.getNombreArchivo().length() - 3).toUpperCase().equals("PDF")) {
				imagen.setTipo(Constantes.CODIGO_TIPO_PDF);
			} else {
				imagen.setTipo(Constantes.CODIGO_TIPO_IMG);
			}
			
			imagen.setNombreArchivo(null);			
			imagenDAO.insertar(imagen);
			
			String nombreArchivo = imagen.getTipo().equals(Constantes.CODIGO_TIPO_IMG) ? imagen.getIdImagen()+FileUtil.EXT[0]:
																						 imagen.getIdImagen()+FileUtil.EXT[1];
			imagen.setNombreArchivo(nombreArchivo);
			
			FileUtil.guardarImagenTemporal(imagen.getArchivo(), imgRuta, nombreArchivo);
			imagenDAO.actualizar(imagen);
			
		} catch (Exception e) {
			logger.error("EX* insertar: " + e.getMessage());
		}
	}

	
	@Override
	public Integer obtenerSiguientePosicionPorSubGrupoYModeloFabrica(Imagen imagen) throws DivemotorBusinessException {
		List<Imagen> listaImagenes = listarImagenes(imagen.getSubGrupo(), imagen.getModeloFabrica());
		if (listaImagenes == null || listaImagenes.size() == 0) {
			return new Integer(1);
		} else {
			return listaImagenes.get(listaImagenes.size() - 1).getOrden() + 1;
		}
		
	}

	@Override
	public void eliminarImagen(Imagen imagen) throws DivemotorBusinessException {
		imagen.setEstado(Constantes.ESTADO_ELIMINADO);
		imagen.setUsuarioEliminacion(DatosDeSession.obtenerUsuarioAutenticado());
		imagen.setFechaEliminacion(FechasUtil.obtenerFechaActual());
		imagenDAO.actualizar(imagen); 
	}

	@Override
	public List<Imagen> listarImagenesPorSubGrupoYTipoComponente(SubGrupo subGrupo, TipoComponente tipoComponente) throws DivemotorBusinessException {
		Imagen imagen = new Imagen();
		imagen.setSubGrupo(subGrupo);
		ModeloFabrica modeloFabrica = new ModeloFabrica();
		modeloFabrica.setTipoComponente(tipoComponente);
		imagen.setModeloFabrica(modeloFabrica);
		return imagenDAO.listarImagenesPorSubGrupoYTipoComponente(imagen);
	}

	@Override
	public List<Imagen> listarImagenesPorMarcaSubGrupoYTipoComponente(Marca marca, SubGrupo subGrupo, TipoComponente tipoComponente) throws DivemotorBusinessException {
		Imagen imagen = new Imagen();
		imagen.setSubGrupo(subGrupo);
		ModeloFabrica modeloFabrica = new ModeloFabrica();
		modeloFabrica.setTipoComponente(tipoComponente);
		modeloFabrica.setMarca(marca);
		imagen.setModeloFabrica(modeloFabrica);
		return imagenDAO.listarImagenesPorMarcaSubGrupoYTipoComponente(imagen);
	}
	
	@Override
	public List<ImagenAdapter> listarImagenesPorMarcaSubGrupoYTipoComponenteYVehiculo(String chasis, String tipoComponente, Integer idSubGrupo) throws DivemotorBusinessException {
		return imagenDAO.listarImagenesPorMarcaSubGrupoYTipoComponenteYVehiculo(chasis, tipoComponente, idSubGrupo);
	}

	@Override
	public void editarImagen(Imagen imagen) throws DivemotorBusinessException {
		imagen.setUsuarioModificacion(DatosDeSession.obtenerUsuarioAutenticado());
		imagen.setFechaModificacion(FechasUtil.obtenerFechaActual());
		imagenDAO.actualizar(imagen);
	}

	@Override
	public List<Imagen> listarImagenesPorSubGrupoModeloFab(ImagenAdapter adapter) {
		return imagenDAO.listarImagenesPorSubGrupoModeloFab(adapter);
	}
	
}
